package Lambda.Streams;

import java.util.Arrays;
import java.util.Collection;

/**
 * Created by LeeXyan on 2017/03/24.
 * 新增的Stream API（java.util.stream）将生成环境的函数式编程引入了Java库中。
 * 这是目前为止最大的一次对Java库的完善，以便开发者能够写出更加有效、更加简洁和紧凑的代码。
 *
 * Steam API极大得简化了集合操作（后面我们会看到不止是集合），首先看下这个叫Task的类：
 */
public class Streams  {
   private enum Status {
       OPEN, CLOSED
   }

   private static final class Task {
       private final Status status;
       private final Integer points;

       Task( final Status status, final Integer points ) {
           this.status = status;
           this.points = points;
       }

       public Integer getPoints() {
           return points;
       }

       public Status getStatus() {
           return status;
       }

       @Override
       public String toString() {
           return String.format( "[%s, %d]", status, points );
       }
   }



    public static void main(String[] args) {

        /**
         * Task类有一个分数（或伪复杂度）的概念，另外还有两种状态：OPEN或者CLOSED。现在假设有一个task集合：
         */
        final Collection< Task > tasks = Arrays.asList(
                new Task( Status.OPEN, 5 ),
                new Task( Status.OPEN, 13 ),
                new Task( Status.CLOSED, 8 )
        );

        /**
         * 首先看一个问题：在这个task集合中一共有多少个OPEN状态的点？
         * 在Java 8之前，要解决这个问题，则需要使用foreach循环遍历tasks集合；
         * 但是在Java 8中可以利用steams解决：包括一系列元素的列表，并且支持顺序和并行处理。
         */

        // Calculate total points of all active tasks using sum()
        final long totalPointsOfOpenTasks = tasks
                .stream()
                .filter( task -> task.getStatus() == Status.OPEN )
                .mapToInt( Task::getPoints )
                .sum();

        System.out.println( "Total points: " + totalPointsOfOpenTasks );
    }
}
